package cn.funeralobjects.upms.service;

import cn.funeralobjects.common.jpa.service.JpaEnableService;
import cn.funeralobjects.common.jpa.service.JpaEntityService;
import cn.funeralobjects.common.service.validate.DataCheck;
import cn.funeralobjects.upms.BasicInfo;
import cn.funeralobjects.upms.entity.EApi;
import cn.funeralobjects.upms.enums.HttpMethod;
import cn.funeralobjects.upms.enums.Protocol;
import cn.funeralobjects.upms.model.Api;
import cn.funeralobjects.util.NumberUtils;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * Api 业务接口
 *
 * @author FuneralObjects
 * Create date: 2020/4/26 11:29 AM
 */
public interface ApiService extends JpaEntityService<EApi, Integer>, JpaEnableService<EApi, Integer> {

    String ENTITY_NAME = "API";

    /**
     * 添加api
     *
     * @param scope    范围
     * @param name     名称
     * @param protocol 协议
     * @param method   方法
     * @param url      地址
     * @return 新增的API对象
     */
    EApi addApi(String scope, String name, Protocol protocol, HttpMethod method, String url);

    /**
     * 查询api
     *
     * @param scope    范围
     * @param protocol 协议
     * @param method   方案
     * @param url      地址
     * @return api对象
     */
    Optional<EApi> findApi(String scope, Protocol protocol, HttpMethod method, String url);

    /**
     * 批量添加/更新 Api
     *
     * @param apiDto apiDto集合
     * @return 添加/更新成功的实体集合
     */
    List<EApi> addOrUpdateAll(List<Api> apiDto);

    /**
     * 更新名字
     *
     * @param idNameMap id - name 的map集合
     */
    void updateName(Map<Integer, String> idNameMap);

    /**
     * 更新名字
     *
     * @param id   主键id
     * @param name 名称
     */
    void updateName(Integer id, String name);

    /**
     * 判断是否存在
     *
     * @param scope    范围
     * @param protocol 协议
     * @param method   方法
     * @param url      访问地址
     * @return true - 存在
     */
    boolean exists(String scope, Protocol protocol, HttpMethod method, String url);

    /**
     * 必须非冲突， 若冲突，则抛出异常
     *
     * @param scope    范围
     * @param protocol 协议
     * @param method   方法
     * @param url      访问地址
     */
    default void notConflict(String scope, Protocol protocol, HttpMethod method, String url) {
        DataCheck.conflictData(exists(scope, protocol, method, url), () -> createDataCode("scope-protocol-method-url", String.format("%s-%s-%s-%s", scope, protocol, method, url)));
    }

    /**
     * 过滤出已经存在的Api实体
     *
     * @param apiDto apiDto
     * @return 已经存在的Api集合
     */
    List<EApi> filterForExistsApi(Collection<Api> apiDto);

    /**
     * 获取实体名
     *
     * @return 实体名
     */
    @Override
    default String getName() {
        return ENTITY_NAME;
    }

    /**
     * 获取模块名
     *
     * @return 模块名
     */
    @Override
    default String getModuleName() {
        return BasicInfo.MODULE;
    }

    /**
     * 判断是否有效
     *
     * @param id id
     * @return true - 有效
     */
    @Override
    default boolean isValid(Integer id) {
        return NumberUtils.notZero(id);
    }

}
